﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;

namespace DDD {
    /// <summary>
    /// フラグメント・シェーダークラス
    /// </summary>
    /// <remarks>
    /// シェーダーのコンパイル＆リンクのタイミングは<see cref="ShaderProgram"/>を参照して下さいお。
    /// </remarks>
    public class FragmentShader : Object {

        #region Field
        string source;
        string log;
        #endregion

        #region Property
        /// <summary>
        /// シェーダーソース文字列
        /// </summary>
        public string Source {
            get { return source; }
        }

        /// <summary>
        /// コンパイル・ログ
        /// </summary>
        public string CompileLog {
            get { return log; }
        }

        /// <summary>
        /// このオブジェクトが参照する全DDDオブジェクトを列挙する列挙子
        /// </summary>
        /// <remarks>
        /// 参照にnullは含まれません。同一のオブジェクトが複数出現する可能性があります。
        /// </remarks>
        public override IEnumerable<Object> References {
            get {
                return base.References;
            }
        }
        #endregion

        #region Constructor
        /// <summary>
        /// ファイルから読み込んでFragmentShaderオブジェクトを作成するコンストラクター
        /// </summary>
        /// <remarks>
        /// この段階ではまだコンパイルしません。
        /// </remarks>
        /// <param name="name">ファイル名</param>
        public FragmentShader (string name) {
            if (name == null) {
                throw new ArgumentNullException ("Shader name is null");
            }
            using (var reader = new StreamReader (name)) {
                this.source = reader.ReadToEnd ();
            }
            this.log = "";
        }

        /// <summary>
        /// メモリから読み込んでFragmentShaderオブジェクトを作成するコンストラクター
        /// </summary>
        /// <remarks>
        /// この段階ではまだコンパイルしません。
        /// </remarks>
        /// <param name="stream">ファイル名</param>
        public FragmentShader (MemoryStream stream) {
            if (stream == null) {
                throw new ArgumentNullException ("Stream is null");
            }
            this.source = new StreamReader (stream).ReadToEnd ();
            this.log = "";
        }
        #endregion

        #region Method

        /// <summary>
        /// ログの変更
        /// </summary>
        /// <param name="log">ログ</param>
        internal void SetLog (string log) {
            this.log = log;
        }

        #endregion


    }
}
